package com.keyware.utils.keycloud;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;

import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

import org.apache.commons.lang.StringUtils;

/**
 * session监听器处理类
 * 
 * @ClassName: SessionListener
 * @author 张怀珠
 * @date 2014-03-11
 */
@SuppressWarnings({ "unchecked", "unused" })
public class SessionListener implements HttpSessionAttributeListener, HttpSessionListener {

	public static String LISTENER_NAME = "onlineUser";
	// 获取限制的人员个数
	public static String LISTENER_MAX_USER_COUNT = "userCount";
	private static List onlineUsers;

	private static HashMap sessionMap = new HashMap();

	static {
		if (onlineUsers == null) {
			onlineUsers = Collections.synchronizedList(new ArrayList());
		}
	}

	/*
	 * 当用户session.setAttribute(attrName，xx)操作时 执行attributeAdded方法
	 */
	public void attributeAdded(HttpSessionBindingEvent se) {
		List onlineUserList = onlineUsers;
		// 获取session.setAttribute(attrName，xx)
		String attrName = se.getName();
		// 如果设置的参数是userCount
		if (attrName.equals(LISTENER_MAX_USER_COUNT)) {
			int count = (Integer) se.getValue();
			if (onlineUsers.size() >= count) {
				se.getSession().setAttribute("continueTF", "F");
			} else {
				se.getSession().setAttribute("continueTF", "T");
			}
		}
		// 如果设置的是onlineUser执行
		if (attrName.equals(LISTENER_NAME)) {
			OnlineUser ou = (OnlineUser) se.getValue();
			for (int i = 0; i < onlineUsers.size(); i++) {
				OnlineUser oldou = (OnlineUser) onlineUsers.get(i);
				// 如果是同一个用户&&同一个sessionID那么 ==》 更新在线用户列表
				if (oldou.getId().endsWith(ou.getId()) && oldou.getsId().equals(ou.getsId())) {
					onlineUsers.remove(i);
					i--;
					// 同一个用户不同页面登录
				} else if (oldou.getId().endsWith(ou.getId()) && !oldou.getsId().equals(ou.getsId())) {
					// 现在写，直接删除session相当于，不通知直接踢掉之前登录的用户
					HttpSession oldUserSession = (HttpSession) sessionMap.get(oldou.getsId());
					// oldUserSession.invalidate();
					oldUserSession.setAttribute("tLogin", "true");
				}
			}
			onlineUsers.add(ou);
		}
	}

	/*
	 * 当用户session.removeAttribute(attrName)操作时 执行attributeAdded方法
	 */
	public void attributeRemoved(HttpSessionBindingEvent se) {
		List onlineUserList = onlineUsers;
	}

	/*
	 * 当用户session.removeAttribute(attrName)操作时 执行attributeAdded方法
	 */
	public void attributeReplaced(HttpSessionBindingEvent se) {
		// 获取session.setAttribute(attrName，xx)
		String attrName = se.getName();
		// 如果设置的参数是userCount
		if (attrName.equals(LISTENER_MAX_USER_COUNT)) {
			int count = (Integer) se.getValue();
			if (onlineUsers.size() >= count) {
				se.getSession().setAttribute("continueTF", "F");
			} else {
				se.getSession().setAttribute("continueTF", "T");
			}
		}
		// 如果设置的是onlineUser执行
		if (attrName.equals(LISTENER_NAME)) {
			OnlineUser ou = (OnlineUser) se.getValue();
			for (int i = 0; i < onlineUsers.size(); i++) {
				OnlineUser oldou = (OnlineUser) onlineUsers.get(i);
				// 判空 王保彬 2014-9-15
				if (StringUtils.isEmpty(oldou.getId())) {
					continue;
				}
				// 如果是同一个用户&&同一个sessionID那么 ==》 更新在线用户列表
				if (oldou.getId().endsWith(ou.getId()) && oldou.getsId().equals(ou.getsId())) {
					onlineUsers.remove(i);
					i--;
					// 同一个用户不同页面登录
				} else if (oldou.getId().endsWith(ou.getId()) && !oldou.getsId().equals(ou.getsId())) {
					// 现在写，直接删除session相当于，不通知直接踢掉之前登录的用户
					HttpSession oldUserSession = (HttpSession) sessionMap.get(oldou.getsId());
					// oldUserSession.invalidate();
					oldUserSession.setAttribute("tLogin", "true");
				}
			}
			onlineUsers.add(ou);
		}
	}

	public void sessionCreated(HttpSessionEvent se) {
		AddSession(se.getSession());
	}

	public void sessionDestroyed(HttpSessionEvent se) {
		DelSession(se.getSession().getId());
		for (int i = 0; i < onlineUsers.size(); i++) {
			OnlineUser oldou = (OnlineUser) onlineUsers.get(i);
			if (oldou.getsId().equals(se.getSession().getId())) {
				onlineUsers.remove(i);
				i--;
			}
		}
		// 销毁
	}

	// 保存sessionId和session对应map关系
	public static synchronized void AddSession(HttpSession session) {
		if (session != null) {
			sessionMap.put(session.getId(), session);
		}
	}

	// 删除sessionId和session对应map关系
	public static synchronized void DelSession(String sessionId) {
		if (null != sessionId && "".equals(sessionId)) {
			sessionMap.remove(sessionId);
		}
	}

}
